PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据

您所在的位置:网站首页 python 决策树 PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据

PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据

2023-06-17 17:18| 来源: 网络整理| 查看: 265

全文下载链接:http://tecdat.cn/?p=26219

该数据(查看文末了解数据获取方式)与银行机构的直接营销活动相关,营销活动基于电话。通常,需要与同一客户的多个联系人联系,以便访问产品(银行定期存款)是否会(“是”)或不会(“否”)订阅(点击文末“阅读原文”获取完整代码数据)。

银行数据集 我们的数据集描述

y - 客户是否订阅了定期存款?(二进制:'是','否')

相关视频

我们的目标是选择最好的回归模型来让客户订阅或不订阅定期存款。我们将使用如下算法:

线性回归

随机森林回归

KNN近邻

决策树

高斯朴素贝叶斯

支持向量机

选择最佳模型的决定将基于:

准确性

过采样

数据准备

在本节中,我们加载数据。我们的数据有 45211 个变量。

输入变量:银行客户数据1 - 年龄(数字)2 - 工作:工作类型(分类:'行政'、'蓝领'、'企业家'、'女佣'、'管理'、'退休'、'自雇'、'服务'、'学生'、'技术员'、'失业'、'未知')3 - 婚姻:婚姻状况(分类:'离婚'、'已婚'、'单身'、'不详';注:'离婚'指离婚或丧偶)。4 - 教育(分类:'基础4年'、'基础6年'、'基础9年'、'高中'、'文盲'、'专业课程'、'大学学位'、'未知')5 - 违约:是否有违约的信贷?(分类: '没有', '有', '未知')6-住房:是否有住房贷款?(分类: '否', '是', '未知')7 - 贷款:有个人贷款吗?8 - contact: 联系通信类型(分类:'手机', '电话')。9 - 月:最后一次联系的年份月份(分类:'一月', '二月', '三月', ..., '十一月', '十二月')10 - day\_of\_week:最后一次联系的星期(分类:'mon', 'tue', 'wed', 'thu', 'fri')11 - 持续时间:最后一次联系的持续时间,以秒为单位(数字)。12 - 活动:在这个活动期间为这个客户进行的接触次数(数字,包括最后一次接触)。13 - pdays: 在上次活动中最后一次与客户联系后的天数(数字,999表示之前没有与客户联系)。14 - 以前:在这次活动之前,为这个客户进行的接触次数(数字)。15 - 结果:上次营销活动的结果(分类:"失败"、"不存在"、"成功")。社会和经济背景属性16 - emp.var.rate:就业变化率--季度指标(数值)。17 - cons.price.idx:消费者价格指数--月度指标(数值)。18 - cons.conf.idx:消费者信心指数--月度指标(数字)。19 - euribor3m:银行3个月利率--每日指标(数值)20 - nr.employed: 雇员人数 - 季度指标(数字)

输出变量(所需目标):

y -  客户是否认购了定期存款?(二进制: '是', '否')

data.head(5)

5110d0da1de2ca7d664e1eb0392b30de.png

我们的下一步是查看变量的形式以及是否存在缺失值的问题。

df1 = data.dtypes df1

398cefbe57172b307b4e652acb43bf08.png

df2 = data.isnull().sum()  df2

e4d20eb560e109e8852bbcf35fa8a587.png

我们的下一步是计算所有变量的值。

data\['y'\].value_counts()

832b29d6b0366d9650849f9c2119da69.png

data\['job'\].value_counts()

67b9c711b08224906f6a465c5d4d7ec2.png

data\['marital'\].value_counts()

0d780953a93ab95f38b0880583cbe14d.png

data\['education'\].value_counts()

4c9a2babc209bbd8c40697511bf2050f.png

data\['housing'\].value_counts()

f58c382ee182934f9e48473d9d4cc105.png

data\['loan'\].value_counts()

17233e11bbabacb6b260f32610d6a4d2.png

data\['contact'\].value_counts()

2f8b4caca0512f071ac7449b56e15fdc.png

data\['month'\].value_counts()

f4afe8418bf1de7634cc8b677f27be7c.png

data\['poutcome'\].value_counts()

3cd8db04b7b6be9f440b1a3fbe422a81.png

描述性统计 数值总结 data.head(5)

aac10135f07138ec4cec334e333dbc52.png

改变因变量 y 的值。代替 no - 0 和代替 yes - 1。

data\['y'\] = data\['y'\].map({'no': 0, 'yes': 1}) data.columns

194c8f7a31e8aa52ceb9ceda6d46a4f0.png

对于我们的每个变量,我们绘制一个箱线图来查看是否有任何可见的异常值。

plt.figure(figsize=\[10,25\]) ax = plt.subplot(611) sns.boxplot(data\['age'\],orient="v")

0900d31c4d34e74d85227c0b31985b5a.png

353946d0db024acd745a746019501ab4.png

ffd871fdcad87bb748bca220daadce02.png

d48e9d728474cdd5f4a4b482c2b0ddb0.png

46e5abd02d38b0ecc50a1c5e5280ba5a.png

7294e5438c8a2672c2cef585249889c8.png

我们可以看到许多可见的异常值,尤其是在 balance 、 campaign 、 pdays 的情况下。在 pdays ,我们可以看到很多变量都在分位数范围之外。这个变量是一个特例,它被解码为 -1,这就是我们的图看起来像这样的原因。在表示变量之前的箱线图的情况下,它表示在此活动之前执行的联系数量,在这种情况下,我们还可以注意到许多超出分位数范围的值。

直方图

我们的下一步是查看连续变量的分布和直方图我们可以看到没有一个变量具有正态分布。

plt.figure(figsize=\[10,20\]) plt.subplot(611) g = sns.distplot(data\["age"\], color="r")

fcf10e48a30fd57f20ef267361d1551c.png

78e5accc487b4ae4ab7f8b3c6d0256ae.png

25f068206abd0c33edbb3f8e7677d196.png

8cbca69c4b039959eb9f16180a736399.png

df52d4d530867e6cec9206eb6963bb4e.png

e4040f80232f99b90fb22af451767caa.png

我们的下一步是查看因变量 y 与每个变量或连续变量之间的关系。

g = sns.FacetGrid(data, col='y',size=4) g.map

d6ef4b2ef428dbd351d4d1a562748fb2.png

293b5f1ae43e6d7c387c09ec3869e69a.png

9d3b25aaa3b963457489489773d128ee.png

ea3d283fdfd7dd34eb0fb1804e9eb0ff.png

207ad4008c6fe2f0f091c0d66ac5828a.png

926163511a565d2ef81a3c86207a586b.png

从这些变量中我们可以得到的最有趣的观察是,大多数说不的人年龄在20-40岁之间,在月底的第20天,大多数人也拒绝了这个提议。

分类总结

我们制作仅包含分类变量的数据子集,以便更轻松地绘制箱线图

data_categorical = data\[\['job',  'marital',  'education',  'default', 'housing',  'loan','month', 'y'\]\]

4b685b6b7df50c07cb0e0e5c816512f7.png

fa8d870ca002f375c90af4b2312935c6.png

8c219ccb028527360b985dfe8afa7911.png

我们还查看了分类变量,看看是否有一些有趣的特征从上面的条形图中可以看出,最有趣的结果来自变量:婚姻状况、教育和工作。从代表婚姻状况的图表来看,大多数人都已婚。正如我们在代表教育的图表上看到的那样 - 最大的是接受过中等教育的人数。在约伯的情况下,我们可以看到大多数人都有蓝领和管理工作。

我们还想在马赛克图上查看我们的分类变量与 y 变量之间的关系。

plt.rcParams\['font.size'\] = 16.0

f197d5aaaca324ca29d09fec024a3c1c.png

正如我们所见,大多数人都拒绝了该提议。就地位而言,已婚的人说“不”最多。

c7af1dd1ce3d8ad904c1dd72741f820b.png

在可变违约的情况下,大多数没有违约信用的人也拒绝了该提案。

7d7d5a75e03875c182541ef0e78f76a7.png

大多数有住房贷款的人也拒绝了该提议。

b37be31bfccad07ae7946c1a31fb6b32.png

大多数没有贷款的人拒绝了这个提议。

点击标题查阅往期内容

d2f0530be77fac02e42e8f6665d68a26.png

用PyTorch机器学习神经网络分类预测银行客户流失模型

outside_default.png

左右滑动查看更多

outside_default.png

01

1d846098852b48f1ffd597e7208602be.png

02

610bfa3ab56cd35d15c84c12e7dda8d9.png

03

9ea66b06bc56a97f2b0e64fe656c55b2.png

04

d46d63ec17c80a4ff7daf2410d612070.png

数据挖掘 data.head(5)

51b10b598e69fc305fb1c06f3d7ecf50.png

我们想更深入地研究我们的变量,看看我们是否可以用它们做更多的事情。

我们的下一步是使用 WOE 分析。

finv, IV = datars(data,data.y) IV

5598495fedb591b151f0cf0eca5df934.png

基于对我们有用的 WOE 分析变量是:pdays、previous、job、housing、balance、month、duration、poutcome、contact。在下一步中,我们决定根据 WOE 结果和变量的先前结果删除无用的列。我们删除的其中一个列是 poutcome,尽管它的 WOE 很高,但我们决定删除它,因为从 prevois 分析中我们看到它有许多未知的观察结果。在可变持续时间的情况下,我们也可以看到WOE相当大,甚至可以说这个结果有点可疑。我们决定根据 WOE 结果放弃它,因为我们的模型应该根据过去的数据说明是否建议给某个人打电话。在可变接触的情况下,我们放弃了它,因为对我们来说,接触形式在我们的模型中没有用。我们还删除了变量 day 因为它对我们没有用,因为这个变量代表天数,而该变量的 WOE 非常小。我们删除的最后一个变量是变量 pdays,尽管这个变量 WOE 的结果非常好,但它对我们来说并不是一个有用的变量。

我们分析中剩下的列:

7029f5fa79ce3d13e29b71314ecdf69b.png

特征选择和工程

要执行我们的算法,我们首先需要将字符串更改为二进制变量。

data = pd.get_dummies(data=data, columns = \['job', 'marital', 'education' , 'month'\], \                                    prefix = \['job', 'marital', 'education' , 'month'\])

3df81954fffd9a9ee6c40c95c24f6868.png

我们更改了列的名称。

data.head(5)

3f887695a03ce7d4b85662f54f59cc85.png

创建虚拟变量后,我们进行了 Pearson 相关。

age = pearsonr(data\['age'\], data\['y'\])

0e38ff3e08e6ec22f852bb52a448fcea.png

sns.heatmap(corr

2ebb8815a22032dbcfe001321b786008.png

我们选择了数字列来检查相关性。正如我们所看到的,没有相关性。

我们查看因变量和连续变量之间的关系。

pylab.show()

d85de51933cf321880565fa609116b75.png

交叉验证

经过所有准备工作,我们终于可以将数据集拆分为训练集和测试集。

算法的实现 逻辑回归 K=5 kf = KFold(n_splits=K, shuffle=True) logreg = LogisticRegression() \[\[7872   93\]  \[ 992   86\]\]

989e972b608e65f4008251052e7dc956.png

7708b3e270eb458eb73ce73296f9b482.png

\[\[7919   81\]  \[ 956   86\]\]

6d815c1d845e4aa0d2706643e679e638.png

134140f3b27801cd17aa228d60814454.png

\[\[7952   60\]  \[ 971   59\]\]

77c219902683f1ec5dfea4bb206107ae.png

9e39fc5b2659eba7e628d5f255cacbe8.png

\[\[7871   82\]  \[1024   65\]\]

a1e2d3d4df8e96c810ded963075698e8.png

793794b6380680f2b6578d901e50cb41.png

\[\[7923   69\]  \[ 975   75\]\]

2b2ab4890d42018e2eac07610a951bca.png

2aa7e0a5bbc7ca1a3e4b5c73ae5f967f.png

决策树 dt2 = tree.DecisionTreeClassifier(random\_state=1, max\_depth=2) \[\[7988    0\]  \[1055    0\]\]

4768a5e3b37745dfe098c5360646bcda.png

53af153750b5f5b5ee5b308cd656a256.png

\[\[7986    0\]  \[1056    0\]\]

5dd3632b2c09204a5b869f5ee409c772.png

6d814c75e1ef9da8b105fd87aaf59a3c.png

\[\[7920   30\]  \[1061   31\]\]

b7f1cf55a57203c64ccb501ad13ae7ca.png

630f0d2932f0bfbd206efb1c3580e3c5.png

\[\[8021    0\]  \[1021    0\]\]

5b1ca493fd8484c39de70974787268fe.png

1cbc06aa71783b2093b87f32dfc6e137.png

\[\[7938   39\]  \[1039   26\]\]

49a169d977e48a3cd28b47e6d2ef3152.png

6a83aa28659d19f00e6f440d3003a71f.png

随机森林 random_forest = RandomForestClassifier \[\[7812  183\]  \[ 891  157\]\]

4976e254f1099eac2beb85f3cd1d476c.png

04bb88621b813249d0faa0aeec0aa05d.png

\[\[7825  183\]  \[ 870  164\]\]

0fb172c000082fd5c6e174d94edbff2a.png

bdda0021d242693cbc3943c4723967a8.png

\[\[7774  184\]  \[ 915  169\]\]

c0a358197e91459479b0bcbfd8d84b58.png

2cc4ba95a5101388f98fd5d1aa0bf747.png

\[\[7770  177\]  \[ 912  183\]\]

66eaf6cf22394ecfcb9343b759cbc1b8.png

10ae8c1c6a397c029e74a44e6bdaabe5.png

\[\[7818  196\]  \[ 866  162\]\]

1f94fdb027cf59e0a7a5dd0edfd878f1.png

d9a3465673cb1a8448b7f9e77266159a.png

KNN近邻 classifier = KNeighborsClassifier(n_neighbors =13,metric = 'minkowski' , p=2) print("Mean accuracy: ",accuracyknn/K) print("The best AUC: ", bestaucknn) \[\[7952   30\]  \[1046   15\]\]

aab04c803b4a544924faf803bee16714.png

a3082985af9ad4140d4d9014838c1dc2.png

\[\[7987   30\]  \[1010   15\]\]

168d4ba1621cce644573a71506127eeb.png

b39cb5ca1baa777371c262c4004c7feb.png

\[\[7989   23\]  \[1017   13\]\]

79ba4653bbd1bd592e6bddbf51600332.png

b527c5f16b7a45ddf9e10fd61d7edcc2.png

\[\[7920   22\]  \[1083   17\]\]

b6dc782b59031f28b5529699fb6425ad.png

20cb9302c1a1a77cd0257a85b16f4004.png

\[\[7948   21\]  \[1052   21\]\]

4973d48c23c374eafaef3704844520e4.png

8506c595eb0649f1ff7ce3a1cfcc3682.png

高斯朴素贝叶斯 kf = KFold(n_splits=K, shuffle=True) gaussian = GaussianNB() \[\[7340  690\]  \[ 682  331\]\]

567cc1828ec7b0762634fa35ee9cfea1.png

1255024e974490b39f8192cc6066c606.png

\[\[7321  633\]  \[ 699  389\]\]

35db677ea5a60c9dfa6e9ae8ef0357f2.png

638df301c924e07a77d754ed3f0b965d.png

\[\[7291  672\]  \[ 693  386\]\]

7bd633efc99f82a8bcf068153b317fa3.png

06348c3feb5d7147b173c515bdd295ad.png

\[\[7300  659\]  \[ 714  369\]\]

7b67762ba77803430cb2fc01d15fbfa9.png

1059ee81a73e054be4e93355f6ca5c12.png

\[\[7327  689\]  \[ 682  344\]\]

bcb205b49c7699c6f81cae9daeae160d.png

705748fc019b642d47e035f9a609fef6.png

`````` models = pd.DataFrame({     'Model': \['KNN', 'Logistic Regression',                'Naive Bayes', 'Decision Tree','Random Forest'\],     'Score': \[ accuracyknn/K, accuracylogreg/K,                accuracygnb/K, accuracydt/K, accuracyrf/K\],     'BestAUC': \[bestaucknn,bestauclogreg,bestaucgnb,                 bestaucdt,bestaucrf\]})

9590202fee3aa5e9860727046b91f189.png

我们看到根据 AUC 值的最佳模型是朴素贝叶斯我们不应该太在意最低的 R2 分数,因为数据非常不平衡(很容易预测 y=0)。在混淆矩阵中,我们看到它预测了漂亮的价值真正值和负值。令我们惊讶的是,决策树的 AUC 约为 50%。

欠采样

我们尝试对变量 y=0 进行欠采样

gTrain, gValid = train\_test\_split

bc851b34b82a7f394c9db85bdcfb8d88.png

逻辑回归 predsTrain = logreg.predict(gTrainUrandom)

7524628c853523efcf43b20750cd7786.png

predsTrain = logreg.predict(gTrain20Urandom)

2d8bdf5f5be50613396e75580ba1d33f.png

predsTrain = logreg.predict(gTrrandom)

bd5d8cf82ae2b19bef15b27e1a75c75c.png

决策树 print("Train AUC:", metrics.roc\_auc\_score(ygTrds))

5ade6427cdc885777b3832c45d91c582.png

随机森林 print("Train AUC:", metrics.roc\_auc\_score(ygTr, predsTrain),       "Valid AUC:", metrics.roc\_auc\_score(ygVd, preds))

0db67120c04a254f562fa276eb5133cb.png

KNN近邻 print("Train AUC:", metrics.roc\_auc\_score(ygTrm, predsTrain),       "Valid AUC:", metrics.roc\_auc\_score(ygVal10, preds))

d100a66d7093afd96201d1e403cd3c27.png

高斯朴素贝叶斯 print("Train AUC:", metrics.roc\_auc\_score(ygTraom, predsTrain),       "Valid AUC:", metrics.roc\_auc\_score(ygid, preds))

7aa45ba6b8c16d60c450ecbd61a73591.png

过采样

我们尝试对变量 y=1 进行过采样

feates = datolist() print(feures) feaes.remove('y')

28c7dd0320bf02d62e127c4824287a88.png

print(gTrainOSM.shape) (31945, 39) `````` smt = SMOT (32345, 39) `````` smt = SMOT (32595, 39) `````` ygTrain10OSM=gTrain10OSM\['y'\] gTrain10OSM=gTrain10OSM.drop(columns=\['y'\]) 逻辑回归 print("Train AUC:", metrics.roc\_auc\_score(ygTrin10SM, predsTrain),       "Valid AUC:", metrics.roc\_auc\_score(ygValid, preds))

outside_default.png

决策树 dt2.fit(,ygTranOS) predsTrain = dtpreict(TrainOSM) preds = dt2.predict(gValid)

outside_default.png

随机森林 random_forest.fit(rainOSM, ygTranOS) predsTrain = random_forest.prect(gTraiOSM) p

outside_default.png

KNN近邻 classifier.fit(granOSM, yTanOSM) predsTrain = classifier.predict(gTaiSM) preds = classifier.predict(Vaid)

outside_default.png

高斯朴素贝叶斯 gaussian.fit(gTriOM, ygrainM) predsTrain = gaussian.predcti)

outside_default.png

结论

我们看到欠采样和过采样变量 y 对 AUC 没有太大帮助。

数据获取

在下面公众号后台回复“银行数据”,可获取完整数据。

outside_default.png

本文摘选《PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据》,点击“阅读原文”获取全文完整资料。

outside_default.png

本文中的银行数据分享到会员群,扫描下面二维码即可加群!

outside_default.png

点击标题查阅往期内容

用PyTorch机器学习神经网络分类预测银行客户流失模型

R语言用FNN-LSTM假近邻长短期记忆人工神经网络模型进行时间序列深度学习预测4个案例

Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化

R语言KERAS用RNN、双向RNNS递归神经网络、LSTM分析预测温度时间序列、 IMDB电影评分情感

Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化

Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析

R语言中的神经网络预测时间序列:多层感知器(MLP)和极限学习机(ELM)数据分析报告

R语言深度学习:用keras神经网络回归模型预测时间序列数据

Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类

R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)

MATLAB中用BP神经网络预测人体脂肪百分比数据

Python中用PyTorch机器学习神经网络分类预测银行客户流失模型

R语言实现CNN(卷积神经网络)模型进行回归数据分析

Python使用神经网络进行简单文本分类

R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析

R语言基于递归神经网络RNN的温度时间序列预测

R语言神经网络模型预测车辆数量时间序列

R语言中的BP神经网络模型分析学生成绩

matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类

R语言实现拟合神经网络预测和结果可视化

用R语言实现神经网络预测股票实例

使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测

python用于NLP的seq2seq模型实例:用Keras实现神经网络机器翻译

用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

outside_default.png

outside_default.png

outside_default.png



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3